home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / PASCAL / 0195.ZIP / READ-ME.1ST < prev    next >
Text File  |  1986-01-31  |  30KB  |  573 lines

  1.  
  2.  
  3.                            T U R B O   W H E E L S          
  4.                                version 1.00          
  5.                       Copyright 1984 by Neil J. Rubenking          
  6.                     
  7.           This disk contains quite a few procedures and functions that          
  8.      make TURBO Pascal easier to use.  Why re-invent the wheel when          
  9.      you can get TURBO WHEELS?  I am releasing it for distribution in          
  10.      the User Group/Bulletin Board network subject to the following          
  11.      stipulations:          
  12.                     
  13.      1)  Anyone may get a copy of these files for examina-          
  14.      tion, either through their local Users Group or          
  15.      Bulletin Board, or by sending me a blank, DOUBLE-sided          
  16.      diskette and a prepaid, self-addressed diskette          
  17.      mailer.  Regardless of how the disk is obtained, anyone          
  18.      who actually finds the contents USEFUL should send me          
  19.      $10, so I can continue writing and releasing software          
  20.      in this User-Supported fashion.  Send $10 to:          
  21.                     
  22.                Neil J. Rubenking          
  23.                300 Page St.          
  24.                San Francisco, CA  94102          
  25.           
  26.      2)  I retain all rights to the SOURCE code.  Recipients          
  27.      of the procedures may freely $INCLUDE them in compiled          
  28.      programs, but may not release the SOURCE.          
  29.                     
  30.      3)  Clubs may freely copy and distribute the disk for a          
  31.      nominal fee, not to exceed $8.          
  32.           
  33.           With the legalities aside, I hope you find these procedures          
  34.      useful in your programs.  Each has at least one "driver" program,          
  35.      to illustrate its actual use.  If you are new to the concept of          
  36.      $INCLUDEing pre-written code in your TURBO Pascal programs, study          
  37.      the drivers.  There are also several minor applications/utilities          
  38.      constructed using 8 or 10 of the handy procedures.  A listing and          
  39.      description of the procedures follows.          
  40.           
  41.           A keen observer might correctly deduce the following from          
  42.      the type of files I have put on this disk.          
  43.           1) I don't have a Color/Graphics display          
  44.           2) I don't do much in math and scientific programming          
  45.      3) I do write programs that involve creating and manipu-          
  46.      lating disk files.          
  47.      4) I do like my programs to look and sound good.          
  48.           
  49.           You may have noticed other disks of TURBO files on the          
  50.      market.  One that I have found useful is just called "Procedures          
  51.      and Functions for TURBO Pascal", from:          
  52.                The Success Press          
  53.                P.O. Box 2795          
  54.                Des Plaines, IL          
  55.      Send Bill Todd $20 to receive these procedures.  A list of          
  56.      them is on this disk as "SUCCESS.DOC".          
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.                                                 TURBO WHEELS   page 2
  71.  
  72.           
  73.  
  74.      *** SETTING UP THE DISK ***          
  75.  
  76.           Format a blank diskette with the /S option, to make it a          
  77.      "bootable" DOS disk.  Copy COMMAND.COM onto it, too.  Copy all          
  78.      the files from this diskette onto the new diskette, and finally          
  79.      copy the files TURBO.COM and TURBO.MSG from the TURBO Pascal disk.          
  80.      Now your TURBO is a more powerful development tool -- it has WHEELS!              development tool -- it has WHEELS!          
  81.           
  82.           
  83.      *** FILES ON THIS DISK ***          
  84.  
  85.           The file "README.###" is a list of all the files, with a          
  86.      one-line description of each for quick reference.  The files for          
  87.      INCLUsion in your programs have the extension .LIB or .TYP.          
  88.      Almost every .LIB file has a short program to illustrate its          
  89.      action (often called a "driver").  The drivers have the same name          
  90.      as their .LIB file, but the extension is .PAS.  There are several          
  91.      utility application programs that use 8 or 10 .LIB files, and a          
  92.      few data files (extension .DAT).  Now on to the descriptions of          
  93.      the individual files.          
  94.           
  95.      *** TYPE DECLARATION FILES ***          
  96.           Most of the files on this disk use variables of type REGPACK          
  97.      (for REGister PACK) or FILENAME_TYPE.  The description at the top          
  98.      of the INCLUDE file will indicate if these or any other files          
  99.      need to also be present.  The reason to NOT write these type          
  100.      declarations directly into the files that require them is that          
  101.      TURBO objects to multiple descriptions of the same TYPE.          
  102.           
  103.      FILENAME.TYP contains the definition of "filename_type" as a          
  104.           string of up to 64 characters.          
  105.           
  106.      REGPACK.TYP describes the type of variable required as input by          
  107.           TURBO's procedures INTR and MSDOS.  You do not need to          
  108.           understand these to use them!  (But if you DO, you can do a          
  109.           lot!)          
  110.           
  111.      SCREENS.TYP is the declaration of variable type SCREEN, which is          
  112.           exactly the same "shape" as the (text) video display          
  113.           memory.  Using variables of this TYPE, you can easily do          
  114.           direct screen manipulation.          
  115.           
  116.      ERRMESSG.LIB is another file that is required by quite a few          
  117.           others.  It contains the function MESSAGE which receives as          
  118.           input a one-byte error code (output of a DOS function) and          
  119.           returns the "translation" of that code, as specified in the          
  120.           DOS 2.0 manual.          
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.                                                 TURBO WHEELS   page 3
  136.           
  137.      *** DOS 2.0 FILE HANDLING ***          
  138.           
  139.           TURBO's file handling procedures do NOT work with subdirec-          
  140.      tories, as you may have found out.  The following procedures are          
  141.      implementations of the DOS 2.0 procedures--all the ordinary ones          
  142.      and some new ones, too. {Note: Beginning with Ver 3.0 Turbo does
  143.      support subdirectories and path names.}          
  144.           
  145.      EXTENDIO.DAT is an exact description of the parameters passed to          
  146.           and from these new IO functions.  Until you are used to          
  147.           using them, you may want to actually insert this document          
  148.           into your source for reference (or refer to it using          
  149.           SIDEKICK!).          
  150.           
  151.      EXTENDIO.LIB, for EXTENDed Input/Output contains 2.0 versions of          
  152.           Reset, Rewrite, Close, Read, Write, Seek, and Erase.  Each          
  153.           new procedure has the same name as the one it replaces,          
  154.           preceded by an X (Xreset, Xclose, etc.).  Any time you use          
  155.           these Extended IO procedures, you will also have to $INCLUDE          
  156.           the TYPE files REGPACK.TYP and FILENAME.TYP, and the file          
  157.           ERRMESSG.LIB--all of these procedures return a one-byte          
  158.           error code if anything goes wrong, and ERRMESSG.LIB lets you          
  159.           interpret the error by saying "writeLn(message(error))".          
  160.                In the DOS 2.0 mode, instead of a File Variable (a          
  161.           variable of TYPE "file of something") you will use an          
  162.           INTEGER File Handle.  XReset and XRewrite receive a full-          
  163.           path filename (up to 64 characters) and return the file          
  164.           handle, which you will use for all further references to the          
  165.           file.  XClose receives just the file handle (any open file          
  166.           has a handle), and XErase receives just the path/filename.          
  167.                Since DOS 2.0 files are effectively just files of          
  168.           bytes, the XRead and XWrite operations work rather diffe-          
  169.           rently from their forebears.  You pass the File Handle, the          
  170.           variable to/from which data is to be read/written, and the          
  171.           SIZE of that variable (easily obtained with TURBO's SizeOf          
  172.           function).  If the variable is a 1K array, then 1K will be          
  173.           read into it (or written from it).  The Size-passing is          
  174.           necessary.  Without it, you would have to write a new XRead          
  175.           and XWrite for each type of variable!          
  176.                XSeek is a bit complicated.  You pass the File Handle          
  177.           (as usual), the Size of the records in your file, and the          
  178.           point from which you want to start your XSeek (Beginning,          
  179.           End, or Current position), and you get back the new current          
  180.           position.  Even if you don't want the new current position          
  181.           (e.g., you just wanted to set the file pointer back to the          
  182.           beginning, or all the way to the end for APPEND), you still          
  183.           have to provide a dummy variable for it.          
  184.                For very detailed descriptions of the parameters to          
  185.           pass to and from these EXTENDed Input Output operations, see          
  186.           EXTENDIO.DAT.          
  187.           
  188.      MOVEFILE.LIB might well be called "XRename", because it does          
  189.           serve to rename files on any path.  However, the Renaming          
  190.           extends to the full path--you can MOVE a file to a different          
  191.           subdirectory simply by changing its path.  You pass the old          
  192.           path and the new path, and receive the usual one-byte error          
  193.           code if anything goes wrong.          
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.                                                 TURBO WHEELS   page 4
  203.           
  204.      GETFILE.LIB contains two procedures, Find_First and Find_Next.          
  205.           Find_First serves to find the first occurrence of a file          
  206.           matching the template you supply (using the standard DOS          
  207.           wildcard characters, ? for any character and * for anything          
  208.           at all, AND using full-path filenames).  You also specify          
  209.           the File Attribute--you can GET files that are Read-Only,          
  210.           Hidden, System, Volume label, or Directory.  Find_First sets          
  211.           the DTA (Disk Transfer Area) to a buffer supplied by you and          
  212.           either puts information about the file in the buffer, or          
  213.           returns an error code.  Once you have Found the First          
  214.           occurrence, you repeat Find_Next until you don't find any          
  215.           more.          
  216.           
  217.      ALLFILES.LIB is a very handy procedure to include in any program          
  218.           that makes use of other files (e.g., a word processor,          
  219.           picture editor, music maker, &c.).  You pass the top left          
  220.           and bottom right coordinates of an available screen area,          
  221.           and a template for the files you want, and ALLFILES takes          
  222.           over.  It opens and frames a window at the coordinates and          
  223.           displays all matching files.  The user positions a pointer          
  224.           at the required file and presses <return> to select it.  If          
  225.           there are more files than will fit in the window, the user          
  226.           has the choice of selecting a visible file or going on to          
  227.           another window full.  Once a file is selected, ALLFILES          
  228.           erases its window and returns the filename.  Note that your          
  229.           program will not have to test for existence of the file          
  230.           before trying to open it--you KNOW it exists.          
  231.                For an extremely classy use of ALLFILES, you may want          
  232.          to use the technique described in SCREENS.LIB to save          
  233.          whatever is on the screen before calling ALLFILES and pop it          
  234.          right back when ALLFILES is done.          
  235.           
  236.      MKRMDIR.LIB brings the DOS MKDIR and RMDIR (MaKe DIRectory and          
  237.          DIRectory) into TURBO.  If you want to do it, you can.          
  238.           
  239.      FILEATTR.LIB lets you change the File Attribute byte (Read-Only,          
  240.           Hidden, System, Archive) of a file on any path.          
  241.           
  242.      GTSETDIR.LIB lets you GET or SET the current subDIRectory.  It          
  243.           may well be used in conjunction with GETSTDD below.          
  244.           
  245.           
  246. *** DOS 1 OR 2 FILE HANDLING ***          
  247.           
  248.     GETSETDD.LIB uses DOS function calls to GET or SET the Default          
  249.          Drive.          
  250.           
  251.      EXISTFIL.LIB checks for the existence of a file.  You pass it the          
  252.          "old-fashioned" filename (no subdirectory!) and it returns          
  253.          true or false.  (The EXTENDed I/O operations do not directly          
  254.          crash your program if the file requested does not exist, so          
  255.          they don't need a corresponding 2.0 function.)          
  256.           
  257. *** DISK READ/WRITE PROCEDURES ***          
  258.           
  259.      DISKTYP.LIB checks the type of disk (single/double sided, 8/9          
  260.           sectors per track).  You pass the drive letter, and it          
  261.           returns the number of K of disk space (an integer, 160, 180,          
  262.           320, or 360), 0 if an invalid drive was specified, or 1 for          
  263.           a non-standard format.
  264.  
  265.  
  266.  
  267.           
  268.                                                 TURBO WHEELS   page 5
  269.  
  270.      GETSECTR.LIB conducts I/O between a specific sector on the disk          
  271.           and a buffer variable declared by you.  You specify [R]ead          
  272.           or [W]rite and the side, sector, and track, and the buffer          
  273.           variable is either read from or written to the disk.  As          
  274.           usual, a one-byte error code is returned.  On the advice of          
  275.           the DOS Manual, GetSector makes three tries at reading the          
  276.           sector before it gives up and returns an error code.          
  277.                The buffer variable must be 512 bytes, but you can          
  278.           choose to arrange these bytes in convenient ways.  For          
  279.           example, in the application LABEL.PAS, the buffer is an          
  280.           array[1..16] of type directory_entry, and reading a direc-          
  281.           tory sector gives you instant access to its 16 entries.          
  282.           NOTE that, unlike most of the procedures on this disk,          
  283.           GETSECTR does not have a driver with the same name.  The          
  284.           sample programs that use GETSECTR are LABEL and DISKMOD.          
  285.           
  286.      LABEL.PAS uses DISKTYP.LIB, GETSECTR.LIB, and several other files          
  287.           to read and write the volume label.  It first seeks an          
  288.           existing label in the directory (NOTE:  the volume label is          
  289.           just a special kind of directory entry.)  If found, you may          
  290.           change it.  If not found, the first directory slot that is          
  291.           either never-used or erased is converted to a label of your          
  292.           choice.  The current date and time are properly included          
  293.           with your volume label, but the bit-manipulation that does          
  294.           that is horrifying!          
  295.           
  296.      DISKMOD.PAS is a working Disk Sector Viewing and Modifying          
  297.           program, based on DISKMODF.BAS by John VanderGrift.  You          
  298.           select a sector and get it displayed both in (filtered)          
  299.           ASCII and hex.  You can modify the displayed sector by          
  300.           simply typing in new values, but you must specifically ask          
  301.           to record the modifications.  Pressing PgDn and PgUp move to          
  302.           the next or previous sectors--the procedures "increment" and          
  303.           "decrement" embody the DOS sector numbering scheme.          
  304.           
  305. *** VIDEO DISPLAY PROCEDURES ***          
  306.           
  307.      CURSOR.LIB contains the procedure Cursor_Control.  You set the          
  308.           top and bottom "scan lines" for the cursor.  You'll want to          
  309.           $INCLUDE the file MONITOR.LIB and ask to CheckColor before          
  310.           you change the cursor around, because the Monochrome cursor          
  311.           has 14 scan lines (numbered 0 at the top to 13 at the          
  312.           bottom) while the Color cursor is only 7 high (0 to 6).  The          
  313.           normal cursor is 12,13 in Mono and 6,7 in color.  In          
  314.           Monochrome, you can get a two-part cursor by setting the top          
  315.           line below the bottom.  NOTE that you can "kill" the cursor          
  316.           by setting the top line to 48, bottom to 0.          
  317.           
  318.      MONITOR.LIB sets the values of the variables COLOR (boolean) and          
  319.           ScreenSeg (integer) for use by other procedures.  Besides          
  320.           $INCLUDEing it, you must invoke CheckColor at the beginning          
  321.           of your program.          
  322.           
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.                                                 TURBO WHEELS   page 6
  335.  
  336.      SCREEN.LIB contains procedures to read and write the character          
  337.           and screen attribute (i.e., COLOR) at any location on the          
  338.           screen IN TEXT MODE.  The driver, SCREEN.PAS, is a little          
  339.           video game showing how handy these procedures can be.          
  340.           
  341.      POPSCREN.LIB is a slightly frivolous use of the SCREEN data type,          
  342.           declared in SCREENS.TYP.  Several SCREEN variables are          
  343.           created and rapidly switched to the display.  A pop-up menu          
  344.           example is included.          
  345.           
  346.      POPSCREN.DAT is a screen file used by POPSCREN.LIB          
  347.           
  348.      GRFXTABL.LIB defines a table of ROMEntries "on top" of the ROM          
  349.           graphics table, giving us (read-only) access to the dot          
  350.           patterns used to create the monochrome characters.          
  351.           
  352.      TITLES.LIB contains the procedure MakeTitle.  Given a title up to          
  353.           ten characters and a starting row, it makes a big title on          
  354.           the screen by using the character patterns from GRFXTABL.          
  355.           
  356.      WINDOWS.LIB offers another approach to using windows.  The          
  357.           variable type "corners" is declared to be an array[1..4] of          
  358.           byte.  Windows that your program will use are set at the          
  359.           beginning of the program by declaring CONSTants of type          
  360.           "corners".  The procedures DoWindow and DoFrame operate on          
  361.           input of type "corners".  If, later in the development of          
  362.           your program, you want to move the windows around, you just          
  363.           change the CONSTant declaration at the top.          
  364.           
  365. *** kEYBOARD PROCEDURES ***          
  366.           
  367.      GETKEYS.LIB is one of my favorites.  The line "GetKeys(C,D)"          
  368.           causes your program to wait for a keystroke and, if it is an          
  369.           "ordinary" keystroke, returns the character in C and chr(0)          
  370.           in D.  If, however, it was a "special" keystroke (arrow key,          
  371.           function key), it returns chr(27) in C and a code character          
  372.           in D.  The file KEYCHART.DAT tabulates these special codes.          
  373.           
  374.      KEYBOARD.LIB is another approach to trapping keystrokes.  It uses          
  375.           the keyboard BIOS interrupt $16 to get the scan code and          
  376.           ASCII code of any key pressed.  The file SCANCODE.DAT is a          
  377.           chart of keyboard codes, along with a table of "extended"          
  378.           scan codes.          
  379.           
  380.      FANCYKEY.LIB goes KEYBOARD one better.  It returns a phrase          
  381.           describing the key pressed, such as "Alt-A", "Shift-F1",          
  382.           "Back Tab", etc.          
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.                                                 TURBO WHEELS   page 7
  401.           
  402.      NEWINT9.LIB is an ambitious procedure.  The keyboard's output is          
  403.           generally handled by Interrupt $9, which is called BY THE          
  404.           KEYBOARD whenever a key is struck.  This interrupt checks          
  405.           for shift states, filters out key release codes, and          
  406.           produces the "typematic" effect, whereby a key held down          
  407.           repeats.  Certain applications might be better off WITHOUT          
  408.           the typematic and WITH access to the key release codes -- my          
  409.           own PIANO MAN program comes to mind.  I required a note to          
  410.           sound ONCE when a key was pressed and stop when that key was          
  411.           released.  Games might requires this feature.  If you do use          
  412.           it, your program should:          
  413.                1) invoke procedure SetUpInt, which creates the new          
  414.                interrupt.          
  415.                2) invoke NewInt, which saves the normal interrupt          
  416.                vector and replaces it with directions to the new one.          
  417.                3) MOST IMPORTANT, before the program ends, invoke          
  418.                OldInt to restore the normal interrupt.  If you don't          
  419.                do this, or if your program crashes before it can do          
  420.                it, you cannot communicate through your keyboard, and          
  421.                you have to turn the PC off and on again.          
  422.                Used with care, NEWINT9 can satisfy a real need.          
  423.           
  424. *** GRAPHICS ***          
  425.      (Let me note that I myself do not have a Color/Graphics adapter,          
  426.      so I haven't had much opportunity to write for one.  However, the          
  427.      mighty BORLAND has a Graphics tool set for their usual price of          
  428.      $50.)          
  429.           
  430.      CIRCLE.LIB draws a circle on your screen.  You specify six          
  431.           parameters: H, K and R are the X and Y coordinates of the          
  432.           circle's center and its radius.  "Res" is the resolution --          
  433.           the number of dots used to draw the circle is proportional          
  434.           to Res, as is the time required to draw it.  "Aspect" is a          
  435.           real value that describes the circle's "roundness" -- adjust          
  436.           to a perfect circle, or change it to get an ellipse.          
  437.           Finally,  "color" can be 1, 2, or 3 if you are in the          
  438.           Graphics mode that supports four colors.  (See the descrip-          
  439.           tion of graphics modes in the TURBO 2.0 manual).          
  440.           
  441.      RECTANGL.LIB naturally draws a rectangle on the screen.  You tell          
  442.           it the X and Y coordinates of the upper left and lower right          
  443.           corners, the color (1, 2, or 3 if appropriate), and 1 for a          
  444.           filled rectangle, 0 for hollow.          
  445.           
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.                                                 TURBO WHEELS   page 8
  467.           
  468. *** MISCELLANEOUS ROUTINES ***          
  469.           
  470.      EQUIPMNT.LIB uses Interrupt $11 to check the equipment attached          
  471.           to your PC.  It reports on number of printers, RS232 ports,          
  472.           game ports, and diskette drives, the initial video mode, or          
  473.           the amount of RAM on the motherboard.          
  474.           
  475.      GETINTGR.LIB is intended to save you the embarrassment of having          
  476.           your program crash because someone made an invalid entry for          
  477.           an integer.  At the same time, it makes sure that the entry          
  478.           is within a ranges you specify.  Non-numeric keystrokes are          
  479.           ignored, BackSpace works, and the function does not give up          
  480.           until a valid integer is entered.          
  481.           
  482.      GETFREE.LIB is another face-saver.  It gets the amount of free          
  483.           space on the current disk.  That way, your programs can          
  484.           check for space and give alternatives if there's not enough,          
  485.           rather than ignominiously crashing.          
  486.           
  487.      HEXFUNCT.LIB contains the procedure HEX which receives an integer          
  488.           and returns a 5-character hex string (e.g., $BF00).  The hex          
  489.           string always refers to a positive number -- TURBO's integer          
  490.           variable type uses its highest bit to indicate sign, thus          
  491.           restricting the integer range to -32,768 to +32,767.  Hex          
  492.           equivalents are calculated by considering negative integers          
  493.           as offsets down from $10000 (decimal 65,536).  Thus, HEX(-1)          
  494.           = $FFFF.  (NOTE:  the TURBO manual says that the integer          
  495.           range is as stated above, but in my experience, it is not          
  496.           possible to enter -32,768. )          
  497.           
  498.      KAVAIL.LIB returns the number of KiloBytes of memory available.          
  499.           It takes into account the MemAvail function's quirk of          
  500.           reporting amounts greater than 32,767 as negative numbers.          
  501.           
  502.      NOSOUND.PAS does nothing but shut off the sound, if one of your          
  503.           programs crashes with sound on.  When you need it, you NEED          
  504.           it!          
  505.           
  506.      PARAMETR.LIB contains the function GetParameter, which returns a          
  507.           string of up to 80 characters consisting of whatever was          
  508.           entered on the command line after the name of the program.          
  509.           This O N L Y works in COMPILED programs.          
  510.           
  511.      QUEUE.LIB is a generic Queue data structure.  One of Pascal's          
  512.           great advantages over BASIC is its implementation of          
  513.           Pointer^ variables and dynamic lists.  By keeping your data          
  514.           in a linked list instead of an array, you can dedicate only          
  515.           as much memory as you need, up to all the memory the system          
  516.           has.  If you test for memory available with KAVAIL before          
  517.           you add each item to the list, you can safely expand to the          
  518.           maximum memory of different systems without crashing for          
  519.           lack of memory.          
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.                                                 TURBO WHEELS   page 9
  533.           
  534.      REBOOT.LIB does just what it says.  The "warm" reboot produced by          
  535.           Interrupt $19 does NOT clear the RAM, so, for example,          
  536.           SIDEKICK will stay resident.  The programs LESSRAM and          
  537.           NUMDISKS use REBOOT to cause the PC to act as if its          
  538.           internal DIP switches had been reset to indicate a different          
  539.           number of disk drives or different amount of RAM.  One note          
  540.           of caution -- There seems to be some interference in this          
  541.           reboot process from certain device drivers in the CONFIG.SYS          
  542.           file.  The symptom is that the driver (e.g., your hard disk          
  543.           driver, or a RAMdisk) installs itself and then the A: drive          
  544.           spins . . . and spins . . . and that's it.  To avoid this          
  545.           problem, you could always rename CONFIG.SYS to something          
  546.           else temporarily.  IF you can figure out why this happens          
  547.           and how to get around it, PLEASE let me know!          
  548.           
  549.      LESSRAM.COM is handy if you always write your programs on your          
  550.           souped-up 640K SuperPC and want to test whether it will          
  551.           actually run on a lesser machine with, say 96K.  You COULD          
  552.           open the box and change the switches, but it's a lot easier          
  553.           just to go back to DOS and type LESSRAM 96.          
  554.           
  555.      NUMDISKS's raison d'etre is the current confusion of method among         RAMdisks.  Some require that the internal switches be set to          
  556.           the total number of physical drives and RAMdisks, while          
  557.           others insist that the switches show physical drives only.          
  558.           If you need to switch around, you can enter NUMDISKS          
  559.           <number>.  If you put NUMDISKS in a batch file, be sure to          
  560.           add an "n" (or "N") to the number so the program won't pause          
  561.           for a keypress before rebooting.          
  562.           
  563.      SAFEWRIT.LIB is one way to get around the fact that you cannot          
  564.           WRITE certain characters to the screen -- they get inter-          
  565.           preted as Control Characters and warp your display.          
  566.           Procedure SafeWrite catches these characters and replaces          
  567.           them with a related character in Low Video.  Note that          
  568.           another approach would be to use the procedures in          
  569.           SCREEN.LIB to send characters directly to the screen          
  570.           memory.  Using this latter method, you can put ANY character          
  571.           on the screen.          
  572.           
  573.